package BancoDeDados.MySQL;

import Biblioteca.VerificaErros;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.swing.JOptionPane;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 * GerenciarOperacoesMySQL
 * 
 * Versao 1.0
 * 
 * Data Criação 10/02/2014
 *
 * @author Igor
 */
public class GerenciarOperacoesMySQL {

    //Atributos
    private PreparedStatement select = null;
    private Connection conn;

    //Construtor
    public GerenciarOperacoesMySQL() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            startCon();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificaErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
    }

    //Outros metodos
    /**
     * Executa o script passado como parametro
     *
     * @param dirArquivo
     */
    private void executeSqlScript(String dirArquivo) throws IOException, SQLException {
        String query = readFile(dirArquivo, Charset.defaultCharset());

        this.select = conn.prepareStatement(query);
        this.select.execute();
        this.select.close();
    }

    /**
     * Faz a conversao do arquivo em disco para o buffer de memoria
     *
     * @param path
     * @param encoding
     * @return
     * @throws IOException
     */
    private String readFile(String path, Charset encoding)
            throws IOException {
        byte[] encoded = Files.readAllBytes(Paths.get(path));
        return encoding.decode(ByteBuffer.wrap(encoded)).toString();
    }

    /**
     * Executa metodos de criacao para as tabelas
     *
     * @return Caso acontececa algum erro
     */
    public String createTables() {
        String mensagem = "";
        try {
            startCon();

            mensagem = executeScript("CODIGOS", mensagem, "tables");
            mensagem = executeScript("EXPRESSAO", mensagem, "tables");
            mensagem = executeScript("FASE", mensagem, "tables");
            mensagem = executeScript("IMAGEM", mensagem, "tables");
            mensagem = executeScript("IMAGEM_SUB_FASE", mensagem, "tables");
            mensagem = executeScript("INSTANCIA_JOGO", mensagem, "tables");
            mensagem = executeScript("INSTANCIA_SUB_FASE", mensagem, "tables");
            mensagem = executeScript("JOGO", mensagem, "tables");
            mensagem = executeScript("LOCAL_JOGO", mensagem, "tables");
            mensagem = executeScript("MODO_JOGO", mensagem, "tables");
            mensagem = executeScript("PESSOA", mensagem, "tables");
            mensagem = executeScript("ROSTO", mensagem, "tables");
            mensagem = executeScript("SUB_FASE", mensagem, "tables");

            this.conn.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificaErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
        return mensagem;
    }

    /**
     * Executa metodos de criacao para as routines (procedures e functions)
     *
     * @return Caso acontececa algum erro
     */
    public String createRoutines() {
        String mensagem = "";
        try {
            startCon();

            mensagem = executeScript("GER_CODIGOS", mensagem, "routines");
            mensagem = executeScript("GRAVA_CODIGO_GERADO", mensagem, "routines");
            mensagem = executeScript("GRAVA_IMAGEM_SUB_FASE", mensagem, "routines");
            mensagem = executeScript("GRAVA_INSTANCIA_JOGO", mensagem, "routines");
            mensagem = executeScript("GRAVA_INSTANCIA_SUB_FASE", mensagem, "routines");
            mensagem = executeScript("GRAVA_PESSOA", mensagem, "routines");

            this.conn.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificaErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
        return mensagem;
    }

    /**
     * Este metodo localiza o script.sql e o executa
     *
     * @return Caso acontececa algum erro
     */
    private String executeScript(String script, String mensagem, String subDiretorio) {
        String diretorio = "./createStatement/" + subDiretorio + "/";
        String nameScript = "tref_" + script.toLowerCase() + ".sql";
        if (mensagem.equals("")) {
            try {
                executeSqlScript(diretorio + nameScript);
            } catch (Exception e) {
                mensagem = "Erro na criação da tebela " + script + "!\nEntre em contato com o suporte técnico.";
                e.printStackTrace();
            }
        }
        return mensagem;
    }

    private void startCon() throws SQLException {
        this.conn = DriverManager.getConnection("jdbc:mysql://localhost/?user=root&password=masterkey&allowMultiQueries=true");
    }
}
